package com.sunrise.configuracoes.bean;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.annotation.Resource;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;

import lombok.Getter;

import org.springframework.stereotype.Controller;

import com.sunrise.configuracoes.servico.ManterPerfilService;
import com.sunrise.configuracoes.servico.ManterUsuarioService;
import com.sunrise.configuracoes.visao.UsuarioForm;
import com.sunrise.generico.bean.ManterBean;
import com.sunrise.generico.bean.SessionBean;
import com.sunrise.generico.entidade.Perfil;
import com.sunrise.generico.entidade.Usuario;
import com.sunrise.generico.enums.TipoFrequencia;
import com.sunrise.generico.enums.TipoStatus;
import com.sunrise.generico.util.MessagesUtil;
import com.sunrise.generico.util.facebook.FacebookUser;
import com.sunrise.generico.visao.Filtro;

@ManagedBean
@ViewScoped
@Controller
public class ManterUsuarioBean extends ManterBean<Usuario> {

	@Resource
	@Getter
	private ManterPerfilService perfilService;

	@Resource
	@Getter
	private ManterUsuarioService usuarioService;

	@Resource
	@Getter
	private UsuarioForm formulario;

	private static final String EDITAR_CONTA = "editar";

	@Override
	public void inicializarEntidade() {
		setEntidade(new Usuario());
		setStatus(Arrays.asList(TipoStatus.values()));
		setFiltro(new Filtro());
		getEntidade().setPerfil(new Perfil());
		getEntidade().setAtivo(Boolean.TRUE);
	}

	@Override
	public void preRenderList(ComponentSystemEvent event) {
		inicializarEntidade();
		setFiltro(new Filtro());
		getFiltro().setAtivo(getStatus().iterator().next());
		setEntidades(getUsuarioService().buscarPorFiltros(getFiltro()));
	}

	@Override
	public List<Usuario> iniciarlizarListEntidade() {
		return new ArrayList<Usuario>();
	}

	@Override
	public void preRenderNew(ComponentSystemEvent event) {
		inicializarEntidade();
		carregarFormulario();
	}

	private void carregarFormulario() {
		getFormulario().setUsuarioSelecionado(new FacebookUser());
		getFormulario().setPerfis(getPerfilService().listarOrdenado());
		getFormulario().setTiposPeriodo(Arrays.asList(TipoFrequencia.values()));
		
	}

	public void preRenderEditUsuarioLogado() {
		getFormulario().setPerfis(getPerfilService().listarOrdenado());
		setEntidade(obterUsuarioLogado());
	}

	@Override
	public void preRenderEdit(ComponentSystemEvent event) {
		carregarFormulario();
	}

	public String editarConta() {
		ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
		SessionBean bean = (SessionBean) context.getSessionMap().get("sessionBean");
		setEntidade(getUsuarioService().buscarUsuarioPorId(bean.getUsuarioLogado().getId()));
		preRenderEdit(null);
		return EDITAR_CONTA;

	}

	public String alterarSenha() {
		if (getUsuarioService().validarNovaSenha(getEntidade())) {
			MessagesUtil.addNewInfoMessage(getUsuarioService().alterarSenha(getEntidade()));
		} else {
			MessagesUtil.addNewAlertMessage(MessagesUtil.getMessageKey("senhaIncorreta"));
			return "";
		}
		return getListar();
	}

	@Override
	public String alterar() {
		if (getService().validarCampoUnico(getEntidade(), "username", getEntidade().getUsername())) {
			getService().alterar(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("alteradoSucesso"));
			return getListar();
		} else {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("campoExistente"));
		}
		return null;
	}

	public void alterarPerfil() {
		getService().alterar(getEntidade());
		MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("perfilAlteradoSucesso"));
	}

	public void validarEmail() {
		if (getEntidade().getEmail() != null && !getEntidade().getEmail().isEmpty()) {
			Pattern p = Pattern.compile("^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$");
			Matcher m = p.matcher(getEntidade().getEmail());
			if (!m.matches()) {
				MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("emailInvalido"));
			}
		}
	}

	@Override
	public String salvar() {
		if (getService().validarCampoUnico(getEntidade(), "username", getEntidade().getUsername())) {
			getUsuarioService().inserir(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("criadoSucesso"));
			buscarPorFiltros();
			return getListar();
		} else {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("campoLoginExistente"));
		}
		return null;
	}

	@Override
	public String salvarContinuar() {
		if (getService().validarCampoUnico(getEntidade(), "username", getEntidade().getUsername())) {
			getUsuarioService().inserir(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("criadoSucesso"));
			buscarPorFiltros();
			return criarEntidade();
		} else {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("campoLoginExistente"));
		}
		return null;
	}

	public String habilitar() {
		try {
			getEntidade().setAtivo(Boolean.TRUE);
			getService().alterar(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroHabilitadoSucesso"));
			buscarPorFiltros();
			return getListar();
		} catch (Exception e) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroNaoHabilitado"));
			return null;
		}
	}

	public String desabilitar() {
		try {
			getEntidade().setAtivo(Boolean.FALSE);
			getService().alterar(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroDesabilitadoSucesso"));
			buscarPorFiltros();
			return getListar();
		} catch (Exception e) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroNaoDesabilitado"));
			return null;
		}
	}

	public void buscarPorFiltros() {
		setEntidades(getUsuarioService().buscarPorFiltros(getFiltro()));
	}

	public void carregarUsuariosFacebook() {
		String[] resultado = getFormulario().getResultGraph().split("<>");
		if (resultado.length < 3) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("nenhumPerfilEncontrado"));
		} else {
			getFormulario().setFacebookUsers(new ArrayList<FacebookUser>());
			FacebookUser user = null;
			for (int cont = 0; cont < resultado.length; cont++) {
				user = new FacebookUser();
				user.setId(resultado[cont++]);
				user.setName(resultado[cont++]);
				user.setPicture(resultado[cont]);
				getFormulario().getFacebookUsers().add(user);
			}

			getFormulario().setResultGraph("");
		}
	}

	public void limparFacebookUsers() {
		getFormulario().setFacebookUsers(new ArrayList<FacebookUser>());
	}

	public void associarPerfil() {
		getEntidade().setFacebookLogin(getFormulario().getUsuarioSelecionado().getId());
	}

}
